#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>


#define NUM 5      // 初始化hash table 容量大小位NUM == 5

typedef struct HashList
{
	int num;    // 记录hash table 里面有多少个元素个数
	char* data; // 指向malloc开辟的数组指针
}HashList;

HashList* HashListInit()
{                          // 开辟结构体
	HashList* list = (HashList*)malloc(sizeof(HashList));
	if (list == NULL)
	{
		return NULL;
	}
	list->num = 0;         // 开辟存储元素的数组
	list->data = (char*)malloc(sizeof(char) * NUM);
	if (list->data == NULL)
	{
		return NULL;
	}

	int i = 0;
	while (i < NUM)    // 初始化 data 指针指向的数组内容都为 0
	{
		list->data[i] = 0;
		i++;
	}

	return list;
}

int HashListIndex(int data)  // 计算元素存储的下标
{
	return data % NUM;       // 0 -- NUM-1
}

void HashListPush(HashList* list, char data)
{
	int Index = HashListIndex(data);

	if (list->data[Index] != 0)   // 这个位置有元素的情况
	{
		int count = 1;
		while (list->data[Index] != 0)  // 不断从后面找没有元素的下标
		{
			Index = HashListIndex(HashListIndex(data) + count);
			count++;
		}
		list->data[Index] = data;
		list->num += 1;
	}
	else                         // 这个位置没有元素的情况，就直接插入数据
	{
		list->data[Index] = data;
		list->num += 1;
	}
}


int main(void)
{
	HashList* list = HashListInit();

	HashListPush(list, 'A');         // A == 65 % 5 == 0
	HashListPush(list, 'B');         // B == 66 % 5 == 1
	HashListPush(list, 'F');         // F == 70 % 5 == 0

	printf("%c  ", list->data[0]);   // A
	printf("%c  ", list->data[1]);   // B
	printf("%c  ", list->data[2]);   // F
	printf("%d\n", list->num);       // 3


	//int arr[2] = { 0 };
	//printf("%p   %p\n", &arr + 1, arr + 1);
	return 0;
}

